package com.generic.trouble;

import java.util.ArrayList;
import java.util.List;

/**Java泛型很大程度上只能提供静态类型检查，然后类型的信息就会被擦除，所以像下面这样利用类型参数创建实例的做法编译器不会通过：
public static <E> void append(List<E> list) {

    E elem = new E();  // compile-time error

    list.add(elem);

}
但是如果某些场景我们想要需要利用类型参数创建实例，我们应该怎么做呢？可以利用反射解决这个问题：
实际上对于上面这个问题，还可以采用Factory和Template两种设计模式解决，感兴趣的朋友不妨去看一下Thinking in Java中第15章中关于Creating instance of types(英文版第664页)的讲解
 * @author DELL
 *
 */
public class Demo3 {

	public static <E> void append(List<E> list, Class<E> cls) throws Exception {
	    E elem = cls.newInstance();   // OK
	    list.add(elem);
	}

	public static void main(String[] args) throws Exception {
		List<String> ls = new ArrayList<>();
		append(ls, String.class);
	}

}
